Contents

9.3 패치 릴리스 노트

릴리스 노트 정보

본 문서는 CUBRID 9.3 Patch1(빌드번호 9.3.1.0005)부터 9.3 Patch 2(빌드번호 9.3.2.0016)까지의 정보를 포함한다.

CUBRID 9.3의 각 패치 버전은 이전 패치 버전에서 발견된 오류 수정 및 기능 개선을 포함한다.

CUBRID 9.3은 CUBRID 9.2에서 발견된 오류 수정 및 기능 개선과 이전 버전들에 반영된 모든 오류 수정 및 기능 개선을 포함한다.

9.0 Beta, 9.1, 9.2에 대한 정보는 9.0 릴리스 노트, 9.1 릴리스 노트, 9.2 릴리스 노트에서 확인할 수 있다.

CUBRID 2008 R4.4에 대한 정보는 http://www.cubrid.org/manual/844/ko/release_note/에서 확인할 수 있다.

CUBRID 2008 R4.3 이하 버전에 대한 정보는 http://release.cubrid.org/ko에서 확인할 수 있다.

동작 변경

9.3 Patch 1

동적 변경이 불가했던 브로커 파라미터 일부를 가능하게 수정 (CUBRIDSUS-13994)

다음 파라미터들의 동적 변경(broker_changer 명령을 통한 값의 변경)이 가능하도록 수정했다.

  • PREFERRED_HOSTS
  • MAX_PREPARED_STMT_COUNT
  • SESSION_TIMEOUT
  • ERROR_LOG_DIR
  • LOG_DIR
  • SLOW_LOG_DIR

call stack dump 및 error log 관련 파라미터에 대해 동적 변경이 가능하도록 수정 (CUBRIDSUS-14120)

call_stack_dump_activation_list, call_stack_dump_deactivation_list, call_stack_dump_on_error, error_log_level, error_log_size, error_log_warning 파라미터에 대해 동적으로 변경해도 DB 서버(cub_server)에는 변경된 값이 반영되지 않았으나, 반영되도록 수정했다. 예를 들어, 수정 이전 버전에서 error_log_level을 ERROR에서 WARNING으로 변경하면 변경을 요청한 응용 프로그램에만 이 값이 변경되고 DB 서버에는 변경되지 않아 DB 서버에서 발생하는 WARINING 메시지가 에러 로그에 기록되지 않지만, 수정 이후에는 DB 서버에도 이 값이 변경되면서 DB 서버의 WARINING 메시지가 에러 로그에 기록된다.

복제 동기화 잠금을 획득하지 못하는 경우의 에러 로그 레벨을 NOTIFICATION 에서 ERROR로 변경 (CUBRIDSUS-14156)

복제 동기화 잠금을 영구히 획득할 수 없어서 복제 반영이 멈춘 경우에도, 에러 로그 레벨에 따라서 에러 로그가 기록되지 않는 문제가 있다. 이 상황을 사용자가 감시할 수 있도록 해당 메시지에 대한 에러 로그 수준을 NOTIFICATION에서 ERROR로 변경했다. 해당 에러 메시지는 applylogdb의 에러 로그 파일($CUBRID/log/<db-name>@<local-node-name>_applylogdb_<db-name>_<remote-node-name>.err )에 출력된다.

Unable to mount disk volume "/home/cubrid/CUBRID/var/APPLYLOGDB/testdb". The database "testdb", to which the disk volume belongs, is in use by user - on process 13223 of host - since -.

복제 동기화 잠금을 영구히 획득할 수 없는 경우는 아래와 같다.

  • 기존 HA 그룹으로 구성되어 복제 반영 중이던 노드가 제거된 경우
  • 기존 HA 그룹으로 구성되어 복제 반영 중이던 노드의 이름이 변경된 경우

기능 추가

9.3 Patch 1

디스크 장애를 감지하는 기능 추가 (CUBRIDSUS-13796)

디스크 장애를 감지하기 위해 cubrid.conf의 ha_monitor_disk_failure_interval 파라미터가 추가되었다. 이 파라미터 값에 설정한 시간마다 디스크 장애 여부를 판단한다.

개선 및 오류 수정

9.3 Patch 2

UPPER/LOWER 함수가 UTF-8 문자열을 입력받으면 오동작함 (CUBRIDSUS-16019)

CREATE TABLE tbl(id INT, s VARCHAR(100));
INSERT INTO tbl values (1, 'ABC' || CHR(0) || 'XYZ');
SELECT * FROM tbl WHERE LOWER(s) LIKE '%'|| 'xyz' ||'%';

수정 이전 버전에서 UTF-8 문자셋을 명시하여 데이터베이스를 생성한 후, 위의 질의를 수행하면 0건을 출력한다.

다중 칼럼으로 구성된 키의 칼럼 중 하나 이상이 내림차순일 때, 해당 테이블에 INSERT ... ON DUPLICATE KEY UPDATE 문을 트리거 내에서 수행하면 실패하는 현상 (CUBRIDSUS-15375)

CREATE TABLE foo ( a INT, b INT ) ;
ALTER TABLE foo ADD PRIMARY KEY ( a ASC, b DESC );
INSERT INTO foo VALUES (1, 1);

아래의 질의를 트리거 내에서 수행하면 수정 이전 버전에서는 그 아래의 에러 메시지가 출력된다.

INSERT INTO foo VALUES (1,1 ) ON DUPLICATE KEY UPDATE b = b + 1;
ERROR: No error message available.

UNION 문이나 부질의에 LIMIT 0이 포함되면 서버 프로세스가 비정상 종료함 (CUBRIDSUS-15369)

CREATE TABLE t1(c1 int, c2 int);
CREATE TABLE t2(c1 int, c2 int);

PREPARE stmt1 FROM '( SELECT fv.c1, fv.c2 as prec2, ? as targetc2
                     FROM t1 fv JOIN t2 gu
                     ON fv.c1=gu.c1
                     LIMIT ? )
                     UNION ALL
                   ( SELECT c1, c2 as prec2, ? as targetc2
                     FROM t1
                     LIMIT ?
                    )
                    LIMIT ?';

EXECUTE stmt1 USING 2,2,2,2,0;

외래 키를 가진 테이블에 값을 INSERT하는 트리거가 발동하면 에러가 발생하는 현상 (CUBRIDSUS-14574)

CREATE TABLE aa(
    pq character(3) NOT NULL,
    title character varying(255),
    CONSTRAINT pk_aa_pq PRIMARY KEY(pq)
);

CREATE TABLE aa_sub(
    pq character(3) NOT NULL,
    hits integer,
    CONSTRAINT pk_aa_sub_pq PRIMARY KEY(pq),
    FOREIGN KEY (pq) REFERENCES aa(pq) ON DELETE CASCADE ON UPDATE RESTRICT
);

CREATE TRIGGER insert_aa
AFTER INSERT ON aa
EXECUTE
insert into [aa_sub] values ([obj].[pq], 0);

INSERT INTO aa VALUES ('000', 'title');
ERROR: Error evaluating action for "insert_aa", The constraint of the foreign key 'fk_aa_sub_pq' is invalid, due to value ''000''.

이 현상은 9.3에서만 발생하며, 9.2 이하 버전에서는 발생하지 않는다.

인덱스가 없는 분할 테이블에 WHERE 조건 없이 "SELECT COUNT(*)"를 수행하면 잘못된 결과를 출력함 (CUBRIDSUS-14335)

CREATE TABLE employees (store_id INT NOT NULL)
  PARTITION BY RANGE (store_id + 100) (
    PARTITION p0 VALUES LESS THAN (105),
    PARTITION p1 VALUES LESS THAN (200),
    PARTITION p3 VALUES LESS THAN MAXVALUE ) ;
INSERT INTO employees VALUES(1);
INSERT INTO employees VALUES(105);
INSERT INTO employees VALUES(106);

SELECT COUNT(*) FROM employees;

수정 이전 버전에서 위의 결과를 수행하면, 0건이 출력되는 오류가 발생한다.

이 현상은 9.3 Patch 1에서만 발생한다.

인라인 뷰에 분석 함수와 문장 집합 연산자를 포함하고 인라인 뷰 외부에 WHERE 조건이 있을 때 오류가 발생함 (CUBRIDSUS-14114)

문장 집합 연산자는 UNION, INTERSECTION, DIFFERENCE를 의미한다. 인라인 뷰 외부의 WHERE 조건은 질의 최적화에 의해 내부의 조건으로 변환될 수 있는데, 이때 변환이 잘못되면서 오류가 발생하는 현상을 수정했다.

다음은 해당 이슈가 발생하는 예이다.

SELECT /*+ RECOMPILE */ host_year, nation_code, gold, silver, rank
FROM
(
SELECT host_year, nation_code, gold , silver, rank() OVER (PARTITION BY host_year ORDER BY gold DESC) AS rank
FROM participant
UNION ALL
SELECT host_year, nation_code, gold, silver, rank() OVER (PARTITION BY host_year ORDER BY silver DESC) AS rank
FROM participant
)
WHERE rank=1;

GROUP BY ... HAVING 질의문에서 HAVING 절의 칼럼을 GROUP BY 절이 포함하지 않으면 집계 함수 결과 값이 잘못됨 (CUBRIDSUS-13764)

HAVING 절에 포함된 칼럼이 GROUP BY 절에 존재하지 않는 경우, HAVING 조건이 집계 결과에 영향을 끼치지 않도록 수정했다.

CREATE TABLE foo (a INT, b INT, c INT);

INSERT INTO foo VALUES (1, 1, 1);
INSERT INTO foo VALUES (1, 2, 2);
INSERT INTO foo VALUES (1, 3, 3);

SELECT a, b, COUNT(c) FROM foo GROUP BY a HAVING b=1;

예를 들어, 위의 질의 수행 시 HAVING 절의 칼럼 b는 GROUP BY 절에 포함되어 있지 않으므로 집계 결과는 HAVING 조건의 영향을 받지 않게 되어 COUNT(c)의 결과 값은 3이 되어야 하지만, 수정 이전 버전에서는 1을 출력한다.

참고로, cubrid.conf의 only_full_group_by 파라미터 값이 yes인 경우에는 HAVING 절에 포함된 칼럼이 반드시 GROUP BY 절에 포함되어야 한다.

SELECT 리스트에 ORDERBY_NUM()이 포함되고, ORDER BY 절에 LIMIT 또는 FOR ORDERBY_NUM() 구문이 포함되어 있는 질의문 수행 시 질의 결과의 크기가 정렬 버퍼의 크기보다 커지면 오류가 발생함 (CUBRIDSUS-16005)

정렬 버퍼의 크기는 cubrid.conf의 sort_buffer_size 파라미터로 설정할 수 있다.

SELECT ORDERBY_NUM(), a, b, c FROM tbl WHERE a > 0 ORDER BY a DESC LIMIT 5, 20;
ERROR: Object buffer underflow while reading.

REPLACE 또는 INSERT ... ON DUPLICATE 문을 수행할 때, 해당 테이블이 다중 컬럼 고유 키를 가지며 키 컬럼 중 일부가 NULL 값이면 데이터베이스 서버 프로세스가 비정상 종료하거나 응용 프로그램이 무한히 대기하는 등의 이상 현상이 발생함 (CUBRIDSUS-15130)

CREATE TABLE foo (
    id integer,
    name character varying(300) ,
    cell_phone character varying(11)
);
CREATE UNIQUE INDEX i_foo on foo (name, cell_phone, id);
REPLACE INTO foo (id, name, cell_phone) VALUES (2,NULL,NULL );

2008 R4.4 이상 버전의 JDBC 드라이버로 2008 R4.1 이하 버전의 CUBRID 엔진에 접속하면 CAS 변경 시 질의 타임아웃 에러가 발생함 (CUBRIDSUS-15656)

동시 접속이 많은 환경에서 CAS 변경이 일어날 때, 질의 타임아웃 시간(연결 URL 문자열에서 queryTimeout으로 설정)을 너무 짧게 잡으면 CAS가 변경된 이후에 이미 질의 타임아웃을 초과하는 상황이 자주 발생할 수 있다.

수정 이전에는 2008 R4.4 이상의 JDBC 드라이버에서 2008 R4.1 데이터베이스 엔진에 접속하고 있을 때 JDBC 드라이버에서 초로 설정한 값이 1/1000로 나뉘어져서, 데이터베이스 엔진에 전달되기 전에 질의 타임아웃이 발생한 것으로 잘못 판단된다.

2008 R4.4 Patch 11, 9.2 Patch 14, 9.3 Patch 2 이상 버전의 JDBC 드라이버에서 이 문제가 수정되었다.

한 응용 프로세스 내에서 사용 가능한 연결 개수의 제한을 1024개에서 2048개로 늘림 (CUBRIDSUS-15340)

수정 이전 버전에서는 한 응용 프로세스 내에서 사용 가능한 연결 개수는 1024개로 제한되어 있는데, 예를 들어 연결 풀의 연결 개수를 1024개를 초과하여 설정할 수 없다. 수정 이후 한 응용 프로세스 내에서 연결 개수를 2048개까지 설정 가능하다.

group_commit_interval_in_msecs 파라미터의 값을 1000보다 작게 설정하면 설정 시간보다 짧은 시간마다 로그를 플러시하는 현상 (CUBRIDSUS-15300)

예를 들어, 수정 이전 버전에서 이 값을 200ms로 설정하면 이보다 짧은 시간마다 로그를 플러시한다.

JDBC/CCI 응용프로그램에서 데이터베이스 서버 프로세스에 격리 수준 또는 잠금 타임 아웃 정보를 불필요하게 설정하거나 요청하는 경우 제거 (CUBRIDSUS-15093)

수정 이전 버전에서는 사용자가 격리 수준 값이나 잠금 타임 아웃 값을 이전 값과 동일하게 설정하면, 브로커의 SQL 로그에서 set_db_parameter 함수가 매번 호출되는것을 확인할 수 있다. 또한 이들 값의 변경이 없는데도 설정값 확인을 위해 매번 get_db_parameter 함수가 호출되는 것을 브로커의 SQL 로그에서 확인할 수 있다.

수정 이후에는 격리수준 값이나 잠금 타임 아웃값의 변경이 없으면 드라이버가 브로커로 설정 요청을 보내지 않는다. 마찬가지로, 격리수준 값이나 잠금 타임 아웃값의 변경이 없으면 그 값을 확인하기 위한 요청도 보내지 않는다.

데이터베이스 연결 과정에서 할당된 CAS가 다른 응용 프로그램에 의해 사용된 이후 cci_get_db_parameter 함수가 호출되면 함수 수행 이후에도 트랜잭션이 진행 중인 상태로 남아있는 현상 (CUBRIDSUS-15091)

응용 프로그램 A에 할당된 CAS가 다른 응용 프로그램 B에 의해 사용된 이후에, 원래 응용 프로그램 A에서 요청한 cci_get_db_paramter() 를 처리하는 CAS의 상태가 요청을 처리한 이후에도 트랜잭션 진행중(CLIENT_WAIT)인 상태로 남는 문제를 수정했다. CAS의 상태는 "cubrid broker status" 명령으로 확인할 수 있다.

"cubrid restore" 명령에 --up-to-date 옵션을 사용하는 경우 옵션 지정 시간 이후에 첫번째로 커밋한 트랜잭션까지 복원되는 현상 (CUBRIDSUS-14984)

이 현상은 9.2 Patch 11, 9.3 Patch 1 버전에서만 발생한다.

$ cubrid restoredb --up-to-date=14-10-2014:14:10:00 testdb

DISTINCT와 같은 질의문에서 정렬 연산 수행 도중, 실행 중인 사용자의 인터럽트 또는 설정에 의해 질의가 중단되면 서버 프로세스가 비정상 종료함 (CUBRIDSUS-14982)

DISTINCT와 같은 질의문에서 정렬 연산 수행 도중, 다음에 의해 실행이 중단되면 서버 프로세스가 비정상 종료하는 현상을 수정했다.

  • 응용 프로그램 또는 브로커에서 질의 타임아웃을 설정하여 타임아웃이 발생하는 경우
  • 응용 프로그램에서 질의 수행 중 Statement.cancel()을 호출하여 질의를 강제로 종료하는 경우
  • CSQL에서 질의 수행 중 사용자가 Ctrl-C를 누른 경우

자동 커밋 OFF일 때 DDL 수행 직후 요청된 DML 이 실패하면 이미 성공한 DDL이 복제되지 않는 문제 (CUBRIDSUS-14969)

CREATE TABLE tbl (id INT PRIMARY KEY, col2 INT);
COMMIT;
INSERT INTO tbl VALUES (1, 1);
ALTER TABLE tbl ADD COLUMN col1 VARCHAR(10); -- 복제 안 됨
INSERT INTO tbl VALUES (1, 1, 'a'); -- 고유 키 위반으로 실패
COMMIT;

느린 질의 발생 시 CAS 프로세스에서 메모리가 누수되는 현상 (CUBRIDSUS-14793)

cubrid.conf의 sql_trace_slow 파라미터를 설정한 후, 이 값을 초과하여 실행하는 질의(slow query)가 발생하면 CAS 프로세스에서 메모리가 누수되는 현상을 수정했다.

HA 절체 시 마스터 노드의 서버가 to-be-active 상태를 지속할 수 있는 문제 (CUBRIDSUS-15821)

일반적으로 to-be-active 상태 이후 active 상태로 변경되는데, to-be-active 상태가 지속되면 쓰기 작업이 불가능해진다.

HA 종료 이후 15초 이내에 재구동하면 디스크 장애 감지 기능이 오작동할 수 있음(CUBRIDSUS-15793)

HA 재구동 이후 재시작된 노드가 마스터가 된 경우 디스크 장애 감지 기능 오작동으로 인해 슬레이브로 역할이 변경될 수 있는 현상을 수정했다.

9.3 Patch 1

여러 클라이언트를 통해 동시에 INSERT가 수행되는 환경에서 query timeout이 자주 발생하면, DB볼륨에 이상이 발생할 수 있음 (CUBRIDSUS-14026)

여러 클라이언트가 동시에 INSERT를 수행하고 query cancel이나 query timeout이 자주 발생하면, 데이터 페이지의 연결 체인이 잘못될 수 있는 문제를 해결하였다. 이 경우 해당 테이블에 대한 인덱스 스캔결과는 이상이 없으나, 순차스캔의 결과가 잘못될 수 있다. 해당 문제가 발생하면 checkdb를 통해 검출이 되는데, 아래와 같은 오류들이 보고된다.

  • 에러 번호 : -597, -546, -698, -699
Time: 05/14/14 10:04:58.246 - ERROR *** file ../../src/storage/heap_file.c, line 15908 ERROR CODE = -597 Tran = 1, EID = 4
Number of pages for heap file 0|261|630 is inconsistent.
200508 and 200534 were found according to heap chain and file table, respectively.

Time: 05/14/14 10:09:07.070 - ERROR *** file ../../src/transaction/locator_sr.c, line 8252 ERROR CODE = -698 Tran = 1, EID = 9
Internal error: INDEX pk_XXX_id ON CLASS XXX (CLASS_OID: 0|605|4). the number of OIDs in the unique hierarchy: 786125 does not equal the number of OIDs: 786126 found in the unique B+tree plus the number of NULLs: 0 found in the unique hierarchy for B+tree: 0|264|660.

Time: 05/14/14 10:09:07.070 - ERROR *** file ../../src/transaction/locator_sr.c, line 8277 ERROR CODE = -699 Tran = 1, EID = 10
Internal error: INDEX pk_XXX_id ON CLASS XXX (CLASS_OID: 0|605|4). the number of OIDs in the unique hierarchy: 786125 does not equal the number of OIDs: 786126 found in the unique B+tree root statistics for B+tree: 0|264|660.

Time: 05/14/14 10:09:19.281 - ERROR *** file ../../src/transaction/locator_sr.c, line 7827 ERROR CODE = -546 Tran = 1, EID = 11
Internal error: INDEX i_XXX_c_b ON CLASS XXX (CLASS_OID: 0|605|4). Expecting 786125 OID entry values, but 786126 were found on B+tree: 0|299|850.

OR 절이 매우 많이 사용된 질의 수행 시 서버 프로세스가 비정상 종료하는 현상 (CUBRIDSUS-14100)

수정 이후 OR 절이 400개 이상 사용된 질의를 수행하면 다음의 에러 메시지를 출력하여 서버 프로세스의 비정상 종료를 방지한다.

SELECT *
FROM tbl
WHERE id = ?
AND ((email = ? AND uname = ?)
OR(email = ? AND uname = ?)
...
OR(email = ? AND uname = ?)
);
The query has been rejected due to attempt to exceed the maximum allowed nesting level(400).

비활성화한 트리거를 재활성화하면 오류가 발생함 (CUBRIDSUS-14103)

트리거의 상태를 비활성화했다가 재활성화하면 오류가 발생하는 현상을 수정했다.

ALTER TRIGGER trig_tb_a_insert STATUS INACTIVE;
ALTER TRIGGER trig_tb_a_insert STATUS ACTIVE;
ERROR: Attribute "new" was not found.

INSERT 또는 UPDATE로 인한 새 페이지 할당 도중 인터럽트가 발생하면 비정상 오류가 반환되는 현상 (CUBRIDSUS-14205)

INSERT 또는 UPDATE로 인해 새 페이지를 할당받는 도중 인터럽트가 발생하면 -4번 오류("Has been interrupted.")가 발생해야 하지만, -495번 오류가 발생하는 문제를 해결하였다.

ERROR: -495 message : "Execute: Query execution failure #11758."

잠금을 해제하지 않아야 할 상황에서 잠금을 해제하는 현상 (CUBRIDSUS-14216)

한 예로 수정 이전 버전에서 같은 트랜잭션에서 고유 인덱스에 같은 키를 두 번 INSERT하는 경우, 두 번째 INSERT 문이 실패하면서 첫 번째 INSERT 문 수행 시 획득했던 키의 NS_LOCK을 해제하는 현상이 발생한다.

FROM_UNIXTIME()의 입력 인자로 호스트 변수를 사용하면 NULL을 반환하는 문제 (CUBRIDSUS-14282)

CREATE TABLE foo (c1 INT, c2 TIMESTAMP, PRIMARY KEY(c1));
PREPARE stmt1 FROM 'INSERT INTO foo VALUES (?, FROM_UNIXTIME(?))';
EXECUTE stmt1 using 2,2;

시리얼을 포함하는 트리거 실행 도중 해당 시리얼이 제거되면 트리거가 잘못 동작하는 현상 (CUBRIDSUS-14423)

DROP TABLE IF EXISTS tt1;
CREATE TABLE tt1( id INT, col VARCHAR(10));
DROP TABLE IF EXISTS hi;
CREATE TABLE hi( id INT, col VARCHAR(10));
CREATE SERIAL s1;
CREATE TRIGGER trg1 BEFORE INSERT ON tt1 EXECUTE INSERT INTO hi VALUES(s1.NEXT_VALUE,new.col);

DROP SERIAL s1;

INSERT INTO tt1 VALUES(2,'Pool');
SELECT * FROM hi;
SELECT * FROM tt1;

예를 들어, 위의 질의를 수행할 때 마지막 INSERT 문에서 에러가 발생하는 것이 정상이지만 수정 이전 버전에서는 에러가 발생하지 않는다.

이 현상은 9.3에서만 발생한다.

명시한 시간을 초과 실행하는 슬로우 쿼리(slow query)를 이벤트 로그에 출력할 때 서버 프로세스가 비정상 종료하는 현상 (CUBRIDSUS-14781)

"Invalid XASL" 에러가 발생한 이후 슬로우 쿼리(slow query)를 이벤트 로그에 출력하려는 경우 서버 프로세스가 비정상 종료하는 현상을 수정했다. 슬로우 쿼리란 cubrid.conf의 sql_trace_slow 파라미터 값에 설정된 시간을 초과하여 수행하는 질의를 지칭한다.

해당 상황은 sql_trace_slow의 값을 1밀리 초 이하의 매우 작은 값으로 설정했기 때문에 발생한 것이다. sql_trace_slow의 기본 단위는 밀리 초이므로, 이 값을 적절히 큰 값(보통 1초 이상)으로 설정하기를 권장한다.

"Invalid XASL" 에러는 어떤 질의에 대해 PREPARE 연산 이후 해당 질의가 캐시에 없는 상태에서 EXECUTE 연산을 수행할 때 발생하는 에러로, 매우 짧은 시간 이내에 실행되므로 sql_trace_slow의 값을 1밀리 초 이하로 설정하는 경우가 아니면 수정 이전 버전에서도 해당 현상은 발생하지 않는다.

브로커의 CONNECT_ORDER 파라미터 값을 RANDOM으로 설정했는데도 특정 DB에만 접속 빈도가 낮음 (CUBRIDSUS-14272)

해당 설정 환경에서 브로커가 여러 DB 호스트에 골고루 분산되지 않는 현상을 수정했다. 예를 들어 ACCESS_MODE의 값이 RO이고 CONNECT_ORDER의 값이 RANDOM인 설정 환경에서 다수의 standby 서버가 존재하는 경우, 수정 이전 버전에서는 특정 standby 서버에만 접속 빈도가 낮은 현상이 발생한다.

서버 프로세스가 비정상 종료된 이후, 재시작하여 복구하는 과정에서 데이터베이스 볼륨에 이상이 발생할 수 있음 (CUBRIDSUS-14534)

서버 프로세스가 비정상 종료된 이후 재시작되어 복구하는 과정에서, 마지막 체크포인트때 수집된 트랜잭션의 상태에 따라 이미 종료된 트랜잭션의 언두 로그가 잘못 적용되는 문제를 해결하였다.

톰캣 종료 시 CUBRID JDBC에서 예외 처리가 발생하는 현상 (CUBRIDSUS-14710)

CUBRID JDBC를 사용하는 환경에서 톰캣 종료 시 아래와 같은 예외(exception) 처리 로그가 발생하는 현상을 수정했다.

org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: A web application appears to have started a thread named Thread-13 but has failed to stop it. This is very likely to create a memory leak.

다수의 호스트 접속 환경에서 CCI 응용 프로그램이 특정 호스트에만 접속 빈도가 낮음 (CUBRIDSUS-14247)

HA 환경에서 연결 URL의 altHosts에 다수의 호스트를 설정하고 loadBalance 속성을 true로 설정했음에도 불구하고 CCI 응용 프로그램들이 여러 브로커에 고루 분산되어 접속되지 않는 현상을 수정했다.

CCI 응용 프로그램에서 pool statement 사용 시 cci_schema_info 함수로 생성된 요청을 닫으면 응용 프로그램에 비정상 종료함 (CUBRIDSUS-14333)

cci_property_set (ps, "pool_prepared_statement", "true");
ds = cci_datasource_create (ps, &err);
...
req = cci_schema_info(con, CCI_SCH_PRIMARY_KEY, "foo", NULL, CCI_CLASS_NAME_PATTERN_MATCH, &err);
...
cci_close_req_handle (req);

cci_schema_info를 통해 기본 키(primary key) 정보를 구할 때 동일한 정보가 중복되어 출력됨 (CUBRIDSUS-14019)

수정 이전 버전에서 각각 다른 테이블에 같은 이름을 가진 기본 키를 생성하는 경우 해당 현상이 발생한다.

CREATE TABLE test1 (id INT, a INT);
CREATE TABLE test2 (id INT, a INT);

ALTER TABLE test1 ADD CONSTRAINT pk_id PRIMARY KEY(id);
ALTER TABLE test2 ADD CONSTRAINT pk_id PRIMARY KEY(id);
cci_schema_info(src_conn_hid, CCI_SCH_PRIMARY_KEY, test1, NULL, CCI_CLASS_NAME_PATTERN_MATCH, &cci_err);

파일의 내부 정보를 잘못 기록하여 "cubrid checkdb" 수행 시 오류를 출력하는 현상 (CUBRIDSUS-14136)

특정 테이블에 대해 insert 또는 update가 동시에 수행되는 환경에서 query cancel등으로 인해 질의가 실패하는 경우, 상황에 따라 파일의 내부정보가 잘못 기록될 수 있는 문제를 수정했다. 수정 이전 버전에서 해당 문제가 발생해도 데이터베이스 볼륨에 이상이 발생하는 것은 아니다.

파일의 내부 정보가 잘못 기록되면 checkdb 수행 시 -604번 오류가 발생하게 된다.

Time: 05/19/14 11:39:33.771 - ERROR *** file ../../src/storage/file_manager.c, line 10244 ERROR CODE = -604 Tran = 1, EID = 1
Internal Error: An allocation set for file VFID 267|0(Volume "/home/tester/ap/repro/testdb") seems inconsistent in 0 deleted or marked deleted pages and 1 page holes in table

자동 확장되는 GENERIC 볼륨을 checkdb 유틸리티가 오류가 있는 볼륨으로 잘못 판단하는 문제 (CUBRIDSUS-14018)

자동 확장되는 GENERIC 볼륨이 최대 볼륨 크기만큼 확장되지 않은 상태에서 "cubrid checkdb" 명령을 수행하면 해당 볼륨을 오류가 있는 것으로 잘못 보고하는 문제를 수정했다. 이 오류는 공간 부족시 GENERIC 볼륨이 조금씩 확장되는 기능이 추가된 9.2, 9.3 버전에서만 발생한다.

한 트랜잭션 내에서 오버플로우 OID 페이지가 발생한 이후 DROP INDEX 혹은 DROP TABLE을 수행하면 DB 볼륨에 이상이 생김 (CUBRIDSUS-13992)

키의 중복이 심한 환경에서는 하나의 키에 여러 개의 OID를 저장해야 하는데, OID 저장을 위한 공간이 한 페이지(기본 크기: 16KB)의 1/4이 넘으면 오버플로우 OID 페이지가 발생한다.

수정 이전 버전에서 해당 현상이 발생하는 시나리오는 다음과 같다.

NO AUTO COMMIT
DELETE로 레코드 삭제 (이때 오버플로우 OID 페이지가 해제(dealloc)되어야 함)
DROP INDEX (또는 DROP TABLE)
COMMIT

"cubrid checkdb" 명령 수행 도중 몇 가지 오류 상황에서 나머지 검사들을 수행하지 않고 종료되는 문제 (CUBRIDSUS-13987)

"cubrid checkdb"는 데이터베이스에 대한 여러가지 항목에 대한 오류 검사를 수행하는데, 몇 가지 상황에서 특정 항목에 대한 오류를 발견한 이후 나머지 항목에 대한 검사를 이어서 수행하지 않고 종료되는 문제를 수정했다.

applylogdb 프로세스가 DB에 반영하는 SQL 문을 로깅할 때 출력되는 float /double 값의 유효 자리수가 6자리로 고정되는 현상 (CUBRIDSUS-13968)

ha_enable_sql_logging 파라미터 값을 yes로 설정하여 applylogdb의 SQL 문을 로깅할 때, 출력되는 float/double 값의 유효 자리수가 6자리로 고정되는 현상을 수정했다.

백업 수행 시 --sleep-msecs 옵션을 지정하면 수행 시간이 매우 오래 걸리는 현상 (CUBRIDSUS-14383)

"cubrid backupdb" 명령으로 백업 수행 시, 1MB의 파일을 내려받을 때마다 --sleep-msecs 옵션으로 지정한 시간만큼 쉬게 하는 동작을 수행하는데, 이 값의 기본 단위는 밀리초이나 초단위로 잘못 인식되어 백업 수행 시간이 훨씬 오래 걸리는(옵션에 의해 쉬는 시간이 입력 값의 1000배) 현상을 수정했다.